package com.reload.core;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.annotation.Schedules;
import reactor.core.publisher.Flux;
import reactor.core.scheduler.Scheduler;
import reactor.core.scheduler.Schedulers;

import java.io.IOException;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Date: 2024/4/27 0027 - 16:09
 * @Version: 17
 * @Author: Reloading
 * @Description: 线程调度策略
 */
public class ThreadDispatch {
    public static void main(String[] args) throws Exception {
        // 默认还是当前线程，生成整个流、发布流、流操作
        thread();
        System.in.read();
    }

    /**
     *  Schedulers.boundedElastic() 有界、弹性调度  线程池中有 10*CPU核心个数，队列默认100K，存活时间为100秒
     *  Schedulers.immediate(); 无执行上下文
     *  Schedulers.single() 使用固定的一个单线程
     *  Schedulers.parallel(); 并发池  fork join 池
     *
     */
    public static void thread() {
        // 只要不指定线程池，默认发布者用的线程就是订阅者的线程
        Flux.range(1, 10)
                // 在哪个线程池把这个流的数据和操作执行了
                // 只改变发布者线程
                .publishOn(Schedulers.single())
                .log()
                // 只改变订阅者线程
                // .subscribeOn(Schedulers.single())
                .log()
                .subscribe();

        // 自定义线程池
        Scheduler scheduler = Schedulers.fromExecutor(new ThreadPoolExecutor(
                4,
                8,
                60,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>()
        ));
        Schedulers.newParallel("parallel-schedulers");
    }
}
